home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_70 / vocinfo.c < prev    next >
Text File  |  1995-01-01  |  7KB  |  215 lines

  1.  
  2. //------------------------------------------------------------------------------
  3. // Copyright (c) David Welch, 1993
  4. //------------------------------------------------------------------------------
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. #define USHORT unsigned short
  11.  
  12. typedef struct
  13. {
  14.     char name[20];
  15.     unsigned short off;
  16.     unsigned short ver;
  17.     unsigned short id;
  18. } VOCHEADER;
  19.  
  20. char gstring[80];
  21. unsigned char ca;
  22. unsigned short ra;
  23. unsigned long la;
  24. FILE *fp;
  25.  
  26. VOCHEADER v;
  27. char dtype;
  28. unsigned long dlen;
  29. unsigned char tc;
  30. unsigned char pt;
  31. unsigned char md;
  32. unsigned char min;
  33. unsigned char max;
  34. //------------------------------------------------------------------------------
  35. void main ( int argc, char *argv[] )
  36. {
  37.     if(argc==1)
  38.     {
  39.         printf(".VOC file not specified\n");
  40.         exit(1);
  41.     }
  42.     strcpy(gstring,argv[1]);
  43.     strcat(gstring,".VOC");
  44.     if((fp=fopen(gstring,"rb"))==NULL)
  45.     {
  46.         strcpy(gstring,argv[1]);
  47.         if((fp=fopen(gstring,"rb"))==NULL)
  48.         {
  49.             printf("Error opening .VOC file [%s]\n",argv[1]);
  50.             exit(1);
  51.         }
  52.     }
  53.     printf("FILE:  [%s]\n",gstring);
  54.     fread(&v,1,sizeof(VOCHEADER),fp);
  55.     for(ra=0;ra<19;ra++) gstring[ra]=v.name[ra]; gstring[ra]=0;
  56.     if((strcmp(gstring,"Creative Voice File")!=0)||(v.name[ra]!=0x1A))
  57.     {
  58.         printf("Not a Creative Voice File (.VOC)\n");
  59.         exit(1);
  60.     }
  61.     printf("Creative Voice File  V%u.%02u\n",(v.ver>>8)&0xFF,v.ver&0xFF);
  62.     printf("Data starts at offset %08Xh\n",v.off);
  63.     printf("Voice file identification code %04Xh, ",v.id);
  64.     if((((~v.ver)+0x1234)&0xFFFF)==v.id) printf("passed\n");
  65.     else printf("failed (ignored)\n");
  66.     while(1)
  67.     {
  68.         if(fread(&dtype,1,1,fp)==0) break;
  69.         dlen=0; fread(&dlen,1,3,fp);
  70.         printf("\nBlock Type %u:  ",(USHORT)dtype);
  71.         if(dtype==0)
  72.         {
  73.             printf("Terminator\n");
  74.             break;
  75.         }
  76.         if(dtype==1)
  77.         {
  78.             printf("Voice Data\n");
  79.             printf("Block Length %lu\n",dlen);
  80.             fread(&tc,1,1,fp);
  81.             printf("Time Constant %u, ",(USHORT)tc);
  82.             ra=1000000L/(256L-tc);
  83.             printf("%u Hz\n",ra);
  84.             fread(&pt,1,1,fp);
  85.             printf("Pack type %u:  ",(USHORT)pt);
  86.             switch(pt)
  87.             {
  88.                 case 0: printf("8 bit unpacked\n"); break;
  89.                 case 1: printf("4 bit packed\n"); break;
  90.                 case 2: printf("2.6 bit packed\n"); break;
  91.                 case 3: printf("2 bit packed\n"); break;
  92.                 case 4: printf("1 channel multi\n"); break;
  93.                 case 5: printf("2 channel multi\n"); break;
  94.                 case 6: printf("3 channel multi\n"); break;
  95.                 case 7: printf("4 channel multi\n"); break;
  96.                 case 8: printf("5 channel multi\n"); break;
  97.                 case 9: printf("6 channel multi\n"); break;
  98.                 case 10: printf("7 channel multi\n"); break;
  99.                 default: printf("Unknown\n"); break;
  100.             }
  101.             max=0x00;
  102.             min=0xFF;
  103.             for(la=2;la<dlen;la++)
  104.             {
  105.                 fread(&ca,1,1,fp);
  106.                 if(ca>max) max=ca;
  107.                 if(ca<min) min=ca;
  108.             }
  109.             printf("Maximum %u, Minimum %u\n",(USHORT)max,(USHORT)min);
  110.         }
  111.         if(dtype==2)
  112.         {
  113.             printf("Voice Continuation\n");
  114.             printf("Block Length %lu\n",dlen);
  115.             max=0x00;
  116.             min=0xFF;
  117.             for(la=0;la<dlen;la++)
  118.             {
  119.                 fread(&ca,1,1,fp);
  120.                 if(ca>max) max=ca;
  121.                 if(ca<min) min=ca;
  122.             }
  123.             printf("Maximum %u, Minimum %u\n",(USHORT)max,(USHORT)min);
  124.         }
  125.         if(dtype==3)
  126.         {
  127.             printf("Silence\n");
  128.             printf("Block Length (always 3) %lu\n",dlen);
  129.             fread(&ra,1,2,fp);
  130.             printf("Period %u\n",ra);
  131.             fread(&tc,1,1,fp);
  132.             printf("Time Constant %u, ",(USHORT)tc);
  133.             ra=1000000L/(256L-tc);
  134.             printf("%u Hz\n",ra);
  135.         }
  136.         if(dtype==4)
  137.         {
  138.             printf("Marker");
  139.             printf("Block Length %lu\n",dlen);
  140.             fread(&ra,1,2,fp);
  141.             printf("Marker value %u, %04Xh\n",ra,ra);
  142.             if(dlen>2) fseek(fp,ftell(fp)+dlen-2,0);
  143.         }
  144.         if(dtype==5)
  145.         {
  146.             printf("ASCII Text\n");
  147.             printf("Block Length %lu\n",dlen);
  148.             la=dlen;
  149.             while(la)
  150.             {
  151.                 if(la>79) ca=79; else ca=la;
  152.                 la-=ca;
  153.                 fread(gstring,1,ca,fp); gstring[79]=0;
  154.                 printf("%s",gstring);
  155.             }
  156.         }
  157.         if(dtype==6)
  158.         {
  159.             printf("Repeat Loop\n");
  160.             printf("Block Length (always 2) %lu\n",dlen);
  161.             fread(&ra,1,2,fp);
  162.             printf("Count %u\n",ra);
  163.         }
  164.         if(dtype==7)
  165.         {
  166.             printf("End Repeat Loop\n");
  167.             printf("Block Length (always 0) %lu\n",dlen);
  168.         }
  169.         if(dtype==8)
  170.         {
  171.             printf("Extended Block\n");
  172.             printf("Block Length (always 4) %lu\n",dlen);
  173.             fread(&ra,1,2,fp);
  174.             printf("Time constant %u, ",ra);
  175.             ra=256000000L/(65536L-ra);
  176.             printf("%u Hz\n",ra);
  177.             fread(&pt,1,1,fp);
  178.             printf("Pack type %u:  ",(USHORT)pt);
  179.             switch(pt)
  180.             {
  181.                 case 0: printf("8 bit unpacked\n"); break;
  182.                 case 1: printf("4 bit packed\n"); break;
  183.                 case 2: printf("2.6 bit packed\n"); break;
  184.                 case 3: printf("2 bit packed\n"); break;
  185.                 case 4: printf("1 channel multi\n"); break;
  186.                 case 5: printf("2 channel multi\n"); break;
  187.                 case 6: printf("3 channel multi\n"); break;
  188.                 case 7: printf("4 channel multi\n"); break;
  189.                 case 8: printf("5 channel multi\n"); break;
  190.                 case 9: printf("6 channel multi\n"); break;
  191.                 case 10: printf("7 channel multi\n"); break;
  192.                 default: printf("Unknown\n"); break;
  193.             }
  194.             fread(&md,1,1,fp);
  195.             printf("Mode %u, ",(USHORT)md);
  196.             switch(md)
  197.             {
  198.                 case 0: printf("mono\n"); break;
  199.                 case 1: printf("stereo\n"); break;
  200.                 default: printf("unknown\n"); break;
  201.             }
  202.         }
  203.         if(dtype>8)
  204.         {
  205.             printf("UNKNOWN\n");
  206.             printf("Block Length %lu\n",dlen);
  207.             fseek(fp,ftell(fp)+dlen,0);
  208.         }
  209.     }
  210. }
  211. //------------------------------------------------------------------------------
  212. // Copyright (c) David Welch, 1993
  213. //------------------------------------------------------------------------------
  214.  
  215.